// 该代码建立了一个信号处理函数，它会捕获由Ctrl-C产生的SIGINT信号
/* 在该示例中没有使用fprintf或strlen，是因为：
 * 在POSIX中保证write是异步信号安全的，也就是说，可以从一个信号处理函数内部安全地调用它。
 * fprintf或strlen没有类似的安全保证，但在某些实现中它们可能是异步信号安全的。
 **/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

void catchctrlc(int signo) {
    char handmsg[] = "I found Ctrl-C\n";
    int msglen = sizeof(handmsg);
    int ret = write(STDERR_FILENO, handmsg, msglen);
    if (ret == -1) {
        perror("Failed to write to STDERR_FILENO");
        return;
    } else {
        write(STDOUT_FILENO, handmsg, msglen);
    }
}

int main() {
    // 信号处理函数，使用sigaction函数
    struct sigaction act;
    act.sa_handler = catchctrlc;    // 指定特殊处理函数，SIG_DFL表示新处理程序设置为默认，SIG_INT将处理程序设置为被忽略的
    act.sa_flags = 0;               // 没有特殊选项
    if (sigemptyset(&act.sa_mask) == -1 || 
        sigaction(SIGINT, &act, NULL) == -1) {
            perror("Failed to set SIGINT to handle Ctrl-C");
            return -1;
    } else {
        write(STDOUT_FILENO, "succ\n", 5);
    }
    return 0;
}